package com.cw2.structural.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 创建jdk代理类
 */
public class JdkTiktokProxy<T> implements InvocationHandler {

    private T tagert;

    public JdkTiktokProxy(T tagert) {
        this.tagert = tagert;
    }

    /**
     * ClassLoader loader, 当前被代理对象的类加载器
     * Class<?>[] interfaces, 当前被代理对象所实现的所有接口
     * InvocationHandler h, 当前被代理对象执行目标方法的时候我们使用 h 可以定义拦截器增强方法
     */
    public static<T> T getProxy(T t){
        Object o = Proxy.newProxyInstance(t.getClass().getClassLoader(),
                t.getClass().getInterfaces(),
                new JdkTiktokProxy(t));
        return (T)o;
    }

    /**
     * 定义目标方法的拦截逻辑
     * 每个方法进来都会执行改方法
     * @return object
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行了代理方法1");
        Object invoke = method.invoke(tagert, args);
        System.out.println("执行了代理方法2");
        return invoke;
    }
}
